Add template alias emulation to <ratio> git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@120098 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/ratio b/include/ratio index c46f4e2..b9b43d8 100644 --- a/include/ratio +++ b/include/ratio 
@@ -23,13 +23,14 @@  public:  static const intmax_t num;  static const intmax_t den; + typedef ratio<num, den> type;  };    // ratio arithmetic -template <class R1, class R2> struct ratio_add; -template <class R1, class R2> struct ratio_subtract; -template <class R1, class R2> struct ratio_multiply; -template <class R1, class R2> struct ratio_divide; +template <class R1, class R2> using ratio_add = ...; +template <class R1, class R2> using ratio_subtract = ...; +template <class R1, class R2> using ratio_multiply = ...; +template <class R1, class R2> using ratio_divide = ...;    // ratio comparison  template <class R1, class R2> struct ratio_equal; @@ -260,7 +261,7 @@  typedef ratio<1000000000000000000LL, 1LL> exa;    template <class _R1, class _R2> -struct _LIBCPP_VISIBLE ratio_multiply +struct __ratio_multiply  {  private:  static const intmax_t __gcd_n1_d2 = __static_gcd<_R1::num, _R2::den>::value; @@ -274,7 +275,14 @@  };    template <class _R1, class _R2> -struct _LIBCPP_VISIBLE ratio_divide +struct _LIBCPP_VISIBLE ratio_multiply + : public __ratio_multiply<_R1, _R2>::type +{ + typedef typename __ratio_multiply<_R1, _R2>::type type; +}; + +template <class _R1, class _R2> +struct __ratio_divide  {  private:  static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; @@ -288,7 +296,14 @@  };    template <class _R1, class _R2> -struct _LIBCPP_VISIBLE ratio_add +struct _LIBCPP_VISIBLE ratio_divide + : public __ratio_divide<_R1, _R2>::type +{ + typedef typename __ratio_divide<_R1, _R2>::type type; +}; + +template <class _R1, class _R2> +struct __ratio_add  {  private:  static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; @@ -310,7 +325,14 @@  };    template <class _R1, class _R2> -struct _LIBCPP_VISIBLE ratio_subtract +struct _LIBCPP_VISIBLE ratio_add + : public __ratio_add<_R1, _R2>::type +{ + typedef typename __ratio_add<_R1, _R2>::type type; +}; + +template <class _R1, class _R2> +struct __ratio_subtract  {  private:  static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; @@ -331,6 +353,13 @@  >::type type;  };   +template <class _R1, class _R2> +struct _LIBCPP_VISIBLE ratio_subtract + : public __ratio_subtract<_R1, _R2>::type +{ + typedef typename __ratio_subtract<_R1, _R2>::type type; +}; +  // ratio_equal    template <class _R1, class _R2>